原帖 | Jason | 2026-05-13 11:25 | 👍0 | 阅读约1
问题背景:设备 Linux 系统启动后,串口日志输出不完整,内核日志(如 printk 打印)严重缺失,无法正常查看调试信息,给问题定位带来很大阻碍。
🛠️ 排查步骤与关键发现
- 查看内核启动命令行
通过 cat /proc/cmdline 查看内核启动参数,发现关键配置:
console=ttyS0,115200,earlyprintk loglevel=1 quiet root=/dev/mmcblk0p8 rootwait rootfstype=ext4......
这里的核心问题是: loglevel=1 quiet 这组参数。
-
理解 loglevel 和 quiet 的作用
-
loglevel=N :内核日志级别,控制哪些级别的日志会被输出到控制台。- loglevel=1 是严重错误级别,只会输出最致命的内核消息,绝大多数调试信息、普通日志都会被过滤掉。
-
正常调试时,一般会设置为 loglevel=7 (输出所有信息)或 loglevel=8 (输出更多调试信息)。
-
quiet :内核启动时的“安静模式”,会进一步抑制大部分非关键启动日志,配合低 loglevel 会让日志几乎“哑掉”。
-
验证当前内核日志级别
通过 cat /proc/sys/kernel/printk 查看运行时日志级别,输出为:
1 1 1 7
这四个数字的含义是:
控制台日志级别 默认消息级别 最小控制台级别 默认控制台级别
这里的第一个数字 1 ,就是当前控制台的日志级别,和 cmdline 里的 loglevel=1 对应,直接导致了日志被大量过滤。
-
对比日志现象验证
-
第一次启动日志: EXT4-fs 挂载信息、驱动初始化日志等大部分正常信息都缺失,只有少量关键报错/提示。
- 调整 loglevel 后(或在不同启动中对比):日志输出恢复完整,能看到所有驱动、文件系统、模块加载的详细过程,和 quiet 、低日志级别被移除/修改直接相关。
✅ 核心结论
这次日志不完整的根本原因,是内核启动参数中 loglevel=1 和 quiet 的组合:
1. loglevel=1 把控制台日志输出级别设得极低,只允许最严重的错误消息通过;
2. quiet 进一步抑制了启动过程中的非关键日志;
3. 两者叠加,直接导致大部分调试日志被内核丢弃,无法在串口看到。
💡 解决方法与最佳实践
- 临时修改(运行时生效)
把控制台日志级别改成7,立即生效
echo 7 > /proc/sys/kernel/printk
修改后,如果有新的 printk 日志就会完整输出到串口。
- 永久修改(修改内核启动参数)
修改U-Boot的bootargs,移除 quiet ,并把 loglevel 改成 7 或更高:
U-Boot 中修改 bootargs 示例
setenv bootargs
console=ttyS0,115200,earlyprintk loglevel=7 root=/dev/mmcblk0p8 rootwait rootfstype=ext4......
saveenv
- 生产环境与调试环境的区别
生产环境 loglevel 设置 1 没问题,提升性能,调试环节建议 loglevel 设置 7。
其他坑:如果 echo 7 > /proc/sys/kernel/printk 后 dmesg 还是没新的打印,大概率是因为系统缺数没有新的事件发生,不是其他问题(如日志被重定向等)。
相关笔记
- 📁 返回本主题 MOC
- 很多人不知道 Android 和 Linux(如 Ubuntu) 的关系
- 嵌入式 Linux 橙皮书系列更新 v2.0.0 版本
- Linux驱动工程师工作日常
- 分享一个近期遇到的 Linux 问题,涉及多个模块
- base:深圳 宝安区 公司简
- 从MCU转Linux BSP开发